﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using System.Web.Security;
using Controller2.BLL;
using Controller2.Models;
using Controller2.Models.ViewModels;
using Telerik.Web.Mvc;

namespace Controller2.Controllers
{
    [Authorize(Roles = "SysAdmin, Administrador, Gerente, DiretorArte")]
    public class FuncionarioController : Controller
    {
        #region ViewModels
        ControllerBDModelContainer db = new ControllerBDModelContainer();
        FuncionarioViewModel viewModel = new FuncionarioViewModel();
        #endregion

        #region Index
        [Authorize]
        public ActionResult Index() // Index padrão
        {
            ViewBag.IsInRole = User.IsInRole("SysAdmin") || User.IsInRole("Administrador") || User.IsInRole("Gerente") ? true : false; ;
            var dic = new Dictionary<string, int>();
            dic.Add("Código", 1);
            dic.Add("Nome", 2);
            ViewBag.Pesquisa = PesquisaBll.PreencheComboPesquisa(dic, "Consulta de Funcionários: ");
            Session["texto"] = "";
            Session["filtro"] = 0;
            return View();
        }

        [Authorize]
        [GridAction]
        public ActionResult AjaxGrid() // Load da grid do Telerik
        {
            var texto = Session["texto"].ToString();
            var filtro = Convert.ToInt32(Session["filtro"]);
            var model = new GridModel { Data = viewModel.Listar(db, texto, filtro) };
            return View(model);
        }

        [Authorize]
        [HttpPost]
        public ActionResult Pesquisa(string texto, int filtro)
        {
            Session["texto"] = texto;
            Session["filtro"] = filtro;
            return Json(new { salvo = true });
        }

        [Authorize]
        public ActionResult PesquisaFuncionario()
        {
            Session["pesquisaFuncionario"] = "";
            ViewBag.Pesquisa = PesquisaBll.PreencheComboPesquisaFuncionario();
            return View();
        }

        [Authorize]
        [HttpPost]
        public ActionResult TermosPesquisaFuncionario(string texto)
        {
            Session["pesquisaFuncionario"] = texto;
            return Json(new { salvo = true });
        }

        [Authorize]
        [GridAction]
        public ActionResult AjaxPesquisaFuncionario()
        {
            var pesquisaFuncionario = Session["pesquisaFuncionario"].ToString();
            var cli = new GridModel { Data = viewModel.ProcuraFuncionario(db, pesquisaFuncionario) };
            return View(cli);
        }

        [Authorize]
        public ActionResult PesquisaFreelancer()
        {
            Session["pesquisaFreelancer"] = "";
            ViewBag.Pesquisa = PesquisaBll.PreencheComboPesquisaFreelancer();
            return View();
        }

        [Authorize]
        [HttpPost]
        public ActionResult TermosPesquisaFreelancer(string texto)
        {
            Session["pesquisaFreelancer"] = texto;
            return Json(new { salvo = true });
        }

        [Authorize]
        [GridAction]
        public ActionResult AjaxPesquisaFreelancer()
        {
            var pesquisaFreelancer = Session["pesquisaFreelancer"].ToString();
            var cli = new GridModel { Data = viewModel.ProcuraFreelancer(db, pesquisaFreelancer) };
            return View(cli);
        }
        #endregion

        #region Cadastro
        [Authorize]
        public ActionResult Cadastro(int id) // Formulário de Cadastro
        {
            var model = new Pessoa_Func();
            if (id > 0)
            {
                model = FuncionarioBll.GetFuncionario(db, id);
				model.IdEstado = model.Cidade.IdEstado;
                ViewBag.Estado = new SelectList(db.Estado.ToList(), "IdEstado", "NomeEstado", model.IdEstado);
                ViewBag.Cidade = new SelectList(db.Cidade.Where(c => c.IdEstado == model.Cidade.IdEstado), "IdCidade", "NomeCidade", model.IdCidade);
            }
            else
            {
                model.DataCadastro = DateTime.Today;
                model.DataNascimento = new DateTime(1900, 01, 01);
                model.DataContratacao = DateTime.Today;
                model.DataDemissao = null;
                ViewBag.Estado = new SelectList(db.Estado.ToList(), "IdEstado", "NomeEstado");
                ViewBag.Cidade = new SelectList(db.Cidade.ToList().Take(0), "IdCidade", "NomeCidade");
                model.UserName = "";
            }
            return View(model);
        }
        #endregion

        #region Salvar
        [Authorize]
        [HttpPost]
        public ActionResult Salvar(Pessoa_Func modelView) // Método de gravação do registro
        {
            if (ModelState.IsValid)
            {
                try
                {
                    var model = new Pessoa_Func();
                    if (modelView.IdPessoa > 0)
                    {
                        model = FuncionarioBll.GetFuncionario(db, modelView.IdPessoa);
                        TryUpdateModel(model);
                        var tp = TipoPessoaBll.GetTipoPessoa(db, 0, model.IdPessoa);
                        model.TipoPessoa.Remove(tp);
                        switch (model.Funcao)
                        {
                            default:
                                break;
                            case "Funcionario":
                                model.TipoPessoa.Add(TipoPessoaBll.GetTipoPessoa(db, "Funcionário"));
                                break;
                            case "Freelancer":
                                model.TipoPessoa.Add(TipoPessoaBll.GetTipoPessoa(db, "Freelancer"));
                                break;
                            case "DiretorArte":
                                model.TipoPessoa.Add(TipoPessoaBll.GetTipoPessoa(db, "Diretor de Arte"));
                                break;
                            case "Gerente":
                                model.TipoPessoa.Add(TipoPessoaBll.GetTipoPessoa(db, "Gerente"));
                                break;
                        }
                        db.Pessoa.ApplyCurrentValues(model);
                    }
                    else
                    {
                        TryUpdateModel(model);
                        switch (model.Funcao)
                        {
                            default:
                                break;
                            case "Funcionario":
                                model.TipoPessoa.Add(TipoPessoaBll.GetTipoPessoa(db, "Funcionário"));
                                break;
                            case "Freelancer":
                                model.TipoPessoa.Add(TipoPessoaBll.GetTipoPessoa(db, "Freelancer"));
                                break;
                            case "DiretorArte":
                                model.TipoPessoa.Add(TipoPessoaBll.GetTipoPessoa(db, "Diretor de Arte"));
                                break;
                            case "Gerente":
                                model.TipoPessoa.Add(TipoPessoaBll.GetTipoPessoa(db, "Gerente"));
                                break;
                        }
                        db.Pessoa.AddObject(model);
                    }
                    db.SaveChanges();

                    if (Request.IsAjaxRequest())
                    {
                        return Json(new { salvo = true, id = model.IdPessoa, username = model.UserName });
                    }
                    return RedirectToAction("Index");
                }
                catch (Exception ex)
                {
                    if (Request.IsAjaxRequest())
                    {
                        string msgEx = "Houve um erro na gravação dos dados!<br /><br />";
                        if (ex.InnerException == null)
                        {
                            msgEx += ex.Message;
                        }
                        else
                        {
                            msgEx += ex.InnerException.Message;
                        }
                        return Json(new { salvo = false, error = msgEx });
                    }
                    ModelState.AddModelError(string.Empty, ex);
                    return View(modelView);
                }
            }
            else
            {

				if (Request.IsAjaxRequest())
				{
					var msgEx = "Houve um erro desconhecido e não foi possível executar a operação!<br /><br />Por favor, tente novamente mais tarde ou entre em contato com o Administrador do Sistema.";
					return Json(new { salvo = false, error = msgEx });
				}
                return View("Cadastro", modelView);
            }
        }
        #endregion

        #region Excluir
        [Authorize]
        [HttpPost]
        public ActionResult Excluir(int id) // Método de exclusão do registro
        {
            try
            {
                var model = FuncionarioBll.GetFuncionario(db, id);
                var usuario = User.Identity.Name.ToLower();
                if (!model.UserName.Equals(usuario))
                {
                    var tp = TipoPessoaBll.GetTipoPessoa(db, 0, id);
                    model.TipoPessoa.Remove(tp);
                    db.Pessoa.DeleteObject(model);
                    db.SaveChanges();
                    if (!string.IsNullOrWhiteSpace(model.UserName))
                    {
                        Roles.RemoveUserFromRole(model.UserName, tp.Tipo);
                        Membership.DeleteUser(model.UserName);
                    }
                    return Json(new { salvo = true });
                }
                else
                {
                    var msgEx = "Você não pode excluir o próprio cadastro!";
                    return Json(new { salvo = false, error = msgEx });
                }
            }
            catch (Exception ex)
            {
                string msgEx = "Houve um erro na gravação dos dados: <br /><br />";
                if (ex.InnerException == null)
                {
                    msgEx += ex.Message;
                }
                else
                {
                    msgEx += ex.InnerException.Message;
                }
                if (msgEx.Contains("REFERENCE constraint"))
                {
                    msgEx = "Este funcionário não pode ser excluído pois ele está sendo usado em outros cadastros.";
                }
                return Json(new { salvo = false, error = msgEx });
            }
        }
        #endregion

        #region AutoComplete
        [Authorize]
        [HttpPost]
        public JsonResult AutoComplete(int filtro, string termoPesquisa)
        {
            var data = FuncionarioBll.AutoComplete(db, filtro, termoPesquisa, 10);
            return Json(data);
        }

        [Authorize(Roles = "SysAdmin, Administrador, Gerente, DiretorArte")]
        [HttpPost]
        public JsonResult AutoCompletePesquisaFuncionario(string termoPesquisa)
        {
            var data = FuncionarioBll.AutoCompleteFuncionario(db, termoPesquisa, 10);
            return Json(data);
        }

        [Authorize(Roles = "SysAdmin, Administrador, Gerente, DiretorArte")]
        [HttpPost]
        public JsonResult AutoCompletePesquisaFreelancer(string termoPesquisa)
        {
            var data = FuncionarioBll.AutoCompleteFreelancer(db, termoPesquisa, 10);
            return Json(data);
        }

        [Authorize(Roles = "SysAdmin, Administrador, Gerente, DiretorArte")]
        [HttpPost]
        public JsonResult BuscaNomeFuncionario(int id)
        {
            var data = FuncionarioBll.BuscaNomeFuncionario(db, id);
            return Json(data);
        }

        [Authorize(Roles = "SysAdmin, Administrador, Gerente, DiretorArte")]
        [HttpPost]
        public JsonResult BuscaNomeFreelancer(int id)
        {
            var data = FuncionarioBll.BuscaNomeFreelancer(db, id);
            return Json(data);
        }
        #endregion

        #region Auxiliares
        [Authorize(Roles = "SysAdmin, Administrador, Gerente, DiretorArte, Funcionario")]
        [HttpPost]
        public JsonResult CarregarComboCidade(int idEstado)
        {
            var cidade = CidadeBll.GetCidadesPorEstado(db, idEstado);
            return new JsonResult { Data = new SelectList(cidade.ToList(), "IdCidade", "NomeCidade") };
        }
        #endregion
    }
}
